import axios,{Axios, AxiosInstance,AxiosRequestConfig} from "axios";

// 引入封装好的接口类型
import {ResultData} from './interface'
import qsString from 'querystring'
import router from '../router'

let config = {
    baseURL:'/api'
}

// 定义一个类 用于封装请求方法以及拦截器
class Http {
    http:AxiosInstance
    // 构造器
    constructor(config: AxiosRequestConfig) {
        //重新实例化
        this.http = axios.create(config)
        //请求拦截器
        this.http.interceptors.request.use(req => {
            // console.log(req,'req');
            if(req.url != 'userlogin'){
                //添加token
                req.headers.authorization = sessionStorage.getItem('userinfo') ? JSON.parse(sessionStorage.getItem('userinfo') + '').token : null
            }
            return req
        })
        //响应拦截器
        this.http.interceptors.response.use(res => {
            if(res.data.msg == '请设置请求头，并携带验证字符串'){
                alert(res.data.msg)
                    // 强制跳转到登录页
                router.push('/login')
            }else if(res.data.msg == '登录已过期或访问权限以受限'){
                alert(res.data.msg)
                router.push('/login')
            }else{
                return res.data
            }
        })
    }
    //方法
    /* 
     url  必传参数
     params 可有可无
    */
    get<T>(url: string, params?: object): Promise<ResultData<T>> {
        return this.http.get(url, {
            params
        })
    }
        /* 
 url  必传参数
 params 可有可无
 isFile
*/
    post<T>(url: string, params?: any, isFile: boolean = false): Promise<ResultData<T>> {
        let data:any={}
        if (isFile) {
            //有文件
            data = new FormData()
            // ts中不支持for in 
            // for(let i in params){
            //     data.append(i,params[i])
            // }
            for (const [key, val] of Object.entries(params)) {
                data.append(key, val)
            }
        } else {
            data = qsString.stringify(params)
        }
        return this.http.post(url, data)
    }
}

export default new Http(config)